<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>

//【示例1】针对下面数组和待用函数，设计数组中每个元素都调用该函数一次：
var a = [1, 2, 3];		 		// 定义数组直接量
var f = function( x ){ 		// 定义执行函数
    alert(x);
}

for( var i in a ){ 			// 遍历数组，为每个元素调用该函数， 
   f.apply(a[i], [a[i]] ); 	// 并把数组元素转换为数组，作为参数传递给调用函数
}

var a = [1, 2, 3]; 				// 定义数组直接量
var f = function( x ){ 		// 实现对每个元素执行平方计算
    return x*x;
}
var _a = []						// 定义临时中转数组
for( var i in a ){				// 遍历数组
   var i = f.apply(a[i], [a[i]] );
 	// 在每个元素上调用平方计算的函数，并返回计算结果
   _a.push(i); 					// 把计算的结果暂时存储在一个临时数组中
}
a = _a; 						// 使用临时数组覆盖原数组
alert(a); 						// 返回[1, 4, 9]
//【示例2】上面操作虽然能够实现预期设计，但是如果在实际开发中反复使用就会非常麻烦，为此可以设计一个迭代器，把可执行的函数作为参数传递给迭代器，让它帮助自动完成在每个元素上调用函数的任务。
Array.prototype.each = function( f ){ 	// 数组迭代器，扩展Array原型方法
    try{					// 异常处理，避免因为不可预测的错误导致系统崩溃
        this.i || ( this.i = 0 ); 		// 定义临时变量，用来作为迭代计数器
        if( this.length > 0 && f.constructor == Function ){ 
			// 如果数组长度大于0，参数为函数
            while( this.i < this.length ){ 	// 遍历数组
                var e = this[this.i]; 		// 获取当前元素
                if( e && e.constructor == Array ){ 
					// 如果元素存在，且为数组
                    e.each( f ); 				// 递归调用迭代器
                }else{	// 否则，在元素上调用参数函数，并把元素值传递给函数
                    f.apply( e, [e] );
                }
                this.i ++ ; 					// 递加计数器
            }
            this.i = null; 					// 如果遍历完毕，则清空计数器
        }
    }
    catch( w ){ 							// 捕获以后
    }
    return this								// 返回当前数组
}

var a = [1, [2, [3, 4]]]
var f = function( x ){
    alert( x );
}
a.each( f ); 					// 调用迭代器，为每个元素执行一次函数传递
//【示例3】此时不能够使用for/in语句进行循环操作，因为在多重嵌套的数组中，容易产生错误。
Array.prototype.each = function( f ){ 	// 错误的数组迭代器
    try{
        if( this.length > 0 && f.constructor == Function ){
            for( var i in this ){ 		// 使用for/in结构遍历数组成员
                var e = this[i];
                if( e && e.constructor == Array ){
                    e.each( f );
                }else{
                    f.apply( e, [e] );
                }
            }
            this.i = null;
        }
    }
    catch( w ){ }
    return this
}


</script>
</head>
<body>




</body>
</html>
